library(rgdal)#空间数据的处理，读、写。写全了GDAL/OGR;GDAL针对栅格，OGR读矢量。RGDAL能读NC，raster也能读NC
library(dplyr)

options(stringsAsFactors = F)#避免读数据的时候把字符串型的变成factor类型的，先直接读成字符串，以后再通过as.factor变成因子更好。
mpa<-read.csv('mpa.csv')
###用rgdal包读gis数据比用maptool包的read.函数的方式读要少很多错误和坑。
###建议rgdal这个包来读shp文件更好。
admin.poly.dsn<-'pmap.shp'# windows下中文路径存在编码问题
#?如何看admin.poly.dsn的结构？相当于把路径存上，把路径赋值给了这个变量
admin.poly.layername<-ogrListLayers(admin.poly.dsn)[1]
#?这一步的作用？为了获得图层名。
#?ogrListLayers函数是Read OGR vector maps into Spatial objects,这么做的目的？
#?[1]是要提取什么？
admin.poly<-readOGR(admin.poly.dsn,layer = admin.poly.layername,verbose = F)
#?这句话是做什么？为了读矢量。verbose=T，详细信息列出来，打印的信息更多。
#?得到了admin.poly怎么看这个数据是什么样子的？得到的这个admin.poly做什么？
#如何看shp的数据信息和表格
###总结：用以上三句话就可以读出shp文件，以后改这三句话就可以了。


library(devtools)
install_github("rstudio/leaflet")
library(leaflet)
##前端GIS地图库。前端就是浏览器。指的是在浏览器段可看到地图的库。
##作用：把自己的数据投到互联网地图。ggmap是死图，leaflet是可以操作的，是交互的，可缩放，可拖拽。
##国内：国内地图都有偏，高德、GEOQ(ESRI的合作伙伴）、天地图（官方无偏地图）
popup <- paste0("<strong>Name: </strong>", 
                admin.poly$NAME)
##做一个弹出的消息框。可以没有。这句话是要鼠标一指，出现名称。

#?这个是提起什么数据？
leaflet()%>%addPolygons(data=admin.poly,popup=popup)%>%
  addTiles(urlTemplate = 'http://t0.tianditu.cn/DataServer?T=vec_w&X={x}&Y={y}&L={z}')%>%
  addMiniMap()

##加入shp文件一层##读入天地图的底图，为了漂亮#addMiniMap()作用是什么？小图显示位置。
##leftlet()类似于ggplot2的代码

DT::datatable(admin.poly@data,rownames = F, class = 'cell-border compact stripe')
DT::datatable(mpa,rownames = F, class = 'cell-border compact stripe')
##DT包的datatable函数，封装的可交互的数据函数，可以显示交互表格）
##在浏览器中显示可拖拽的表格，为了rmarkdown做准备的。为了展示数据。
##用在交互式的报告和幻灯片中

library(ggplot2)
p <- ggplot()+
  geom_point(data=mpa,mapping=aes(x=long,y=lat,colour=rr,size=PM25))+theme_bw()+
  scale_colour_gradient(low = 'green',high = 'red')
p

cn.df <- fortify(admin.poly)
##fortify为ggplot2服务。把shpfile转换成ggplot2可处理的dataframe格式。
##简单画多边形，就可以不用fortify。但是要调用到shp里面的数据就需要这个函数。

head(cn.df)

main.plot<-ggplot()+
  geom_path(data = cn.df, aes(long, lat, group = group),
            colour = "black")+
  geom_point(data=mpa,mapping=
               aes(x=long,y=lat,colour=rr,size=PM25))+
  theme_bw()+ scale_colour_gradient(low = 'green',high = 'red')
main.plot

sub.plot<-main.plot+
  theme_bw() + labs(x=NULL, y=NULL) +
  theme(axis.line=element_blank(),axis.text.x=element_blank(),
        axis.text.y=element_blank(),axis.ticks=element_blank(),
        axis.title.x=element_blank(),
        axis.title.y=element_blank(),
        legend.position = "none", 
        legend.text=element_text(size=12),
        legend.background =element_blank(),
        panel.background=element_blank(),
        panel.grid.major=element_blank(),panel.grid.minor=element_blank(),
        plot.background=element_blank())+
  coord_cartesian(xlim = c(106.8,122.0),ylim=c(3.307 ,25.25))
subplot<-ggplotGrob(sub.plot)
natioanl.plot<-main.plot+
  coord_cartesian(xlim = c(72.2,135.42),ylim=c(14.7 ,54.45))+
  annotation_custom(grob= subplot,xmin=123.5,xmax = Inf,ymin=-Inf,ymax=30)

natioanl.plot

Encoding(admin.poly$NAME)<-"UTF-8"
##shp文件的中国字不乱码，要有这句话。
head(admin.poly$NAME)
bj.idx<-!is.na(admin.poly$NAME)&admin.poly$NAME=='北京市'
###对是北京的数据进行判断，是北京市显示TURE,不是选FALSE。
###!is.na是对空值进行判断,如果不加这个就会报错
bj.poly<-admin.poly[bj.idx,]
bj.df<-fortify(bj.poly)

library(raster)
bj.extent<-extent(bj.poly)
##取bj.poly的空间范围，外包矩形。能够包住这个北京图的矩形。
ggplot()+
  coord_cartesian(xlim = c(bj.extent@xmin,bj.extent@xmax),
                  ylim=c(bj.extent@ymin ,bj.extent@ymax))+
  geom_path(data = bj.df, aes(long, lat, group = group),
            colour = "black")+
  geom_point(data=mpa,mapping=
               aes(x=long,y=lat,colour=rr,size=PM25))+
  theme_bw()+ scale_colour_gradient(low = 'green',high = 'red')

###@调用数据
###用str函数来首先看结构
str(bj.extent)
##看到了@xmin，来看一下结果，就知道怎么找到这个数据了。
